<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="org.apache.poi.hssf.util.*,org.apache.poi.hssf.usermodel.*,org.apache.poi.ss.usermodel.*,org.apache.poi.xssf.util.*,org.apache.poi.xssf.usermodel.*,java.io.*,model.vo.MtkindVO,java.util.*, java.text.SimpleDateFormat"%> 
<%
String filename = "분류기준수립.xls";    
filename = new String(filename.getBytes("euc-kr"), "8859_1"); 
//엑셀로출력될 화일이름.. request.getParameter("filename")으로 받아서 사용하면 다른 화일이름으로도 저장이 가능합니다.

//ObBean obBean = new ObBean();       //이건 제가사용하던 dbConnection, 한글변환 등의 method들이 있는 빈즈입니다. 이거 빼고 자신이 사용하는 dbConnection을 사용하심됩니다.

//String queryStr = "sp_orderList '2002-11-01','2002-11-22','userid'  "   // queryStr 은 퀴리문으로 단순화하기 위하여 스토어드 프로시져를 사용합니다. (폼값으로 넘겨줘서사용해도 됩니다.이때는 post방식을..)



int rsCnt=2;

HSSFWorkbook wb = new HSSFWorkbook();           //workbook생성
   HSSFSheet sheet1 = wb.createSheet("new sheet");  //worksheet에 new sheet생성

   HSSFRow row = null;
   HSSFCell cell = null;

//제목 스타일
HSSFCellStyle style = wb.createCellStyle(); 
//style.setFillBackgroundColor(HSSFColor.GREY_50_PERCENT.index);
style.setFillForegroundColor(HSSFColor.GREY_50_PERCENT.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);             //채움스타일을 SOLID_FOREGROUND으로 한다.
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

//가운데라인
HSSFCellStyle styleMid = wb.createCellStyle(); 
styleMid.setBorderBottom(HSSFCellStyle.BORDER_THIN);
styleMid.setBorderLeft(HSSFCellStyle.BORDER_THIN);
styleMid.setBorderRight(HSSFCellStyle.BORDER_THIN);
styleMid.setBorderTop(HSSFCellStyle.BORDER_THIN);

//오른쪽
HSSFCellStyle styleRight = wb.createCellStyle(); 
styleRight.setBorderTop(HSSFCellStyle.BORDER_THIN);
styleRight.setBorderRight(HSSFCellStyle.BORDER_THIN);


//왼쪽
HSSFCellStyle styleLeft = wb.createCellStyle(); 
styleLeft.setBorderLeft(HSSFCellStyle.BORDER_THIN);
styleLeft.setBorderBottom(HSSFCellStyle.BORDER_THIN);


//내용 스타일
HSSFCellStyle styleLContent = wb.createCellStyle(); 
styleLContent.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
styleLContent.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);     
styleLContent.setBorderBottom(HSSFCellStyle.BORDER_THIN);
styleLContent.setBorderLeft(HSSFCellStyle.BORDER_THIN);
styleLContent.setBorderRight(HSSFCellStyle.BORDER_THIN);
styleLContent.setBorderTop(HSSFCellStyle.BORDER_THIN);

HSSFCellStyle styleLContent1 = wb.createCellStyle(); 
styleLContent1.setBorderBottom(HSSFCellStyle.BORDER_THIN);
styleLContent1.setBorderLeft(HSSFCellStyle.BORDER_THIN);
styleLContent1.setBorderRight(HSSFCellStyle.BORDER_THIN);
styleLContent1.setBorderTop(HSSFCellStyle.BORDER_THIN);

HSSFCellStyle styleLContentDate = wb.createCellStyle(); 
styleLContentDate.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
styleLContentDate.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);     
styleLContentDate.setBorderBottom(HSSFCellStyle.BORDER_THIN);
styleLContentDate.setBorderLeft(HSSFCellStyle.BORDER_THIN);
styleLContentDate.setBorderRight(HSSFCellStyle.BORDER_THIN);
styleLContentDate.setBorderTop(HSSFCellStyle.BORDER_THIN);
styleLContentDate.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"));


HSSFCellStyle styleLContentDate1 = wb.createCellStyle(); 
styleLContentDate1.setBorderBottom(HSSFCellStyle.BORDER_THIN);
styleLContentDate1.setBorderLeft(HSSFCellStyle.BORDER_THIN);
styleLContentDate1.setBorderRight(HSSFCellStyle.BORDER_THIN);
styleLContentDate1.setBorderTop(HSSFCellStyle.BORDER_THIN);
styleLContentDate1.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"));


HSSFCellStyle styleLContentNoData = wb.createCellStyle(); 
styleLContentNoData.setBorderBottom(HSSFCellStyle.BORDER_THIN);
styleLContentNoData.setBorderLeft(HSSFCellStyle.BORDER_THIN);
styleLContentNoData.setBorderRight(HSSFCellStyle.BORDER_THIN);
styleLContentNoData.setBorderTop(HSSFCellStyle.BORDER_THIN);
styleLContentNoData.setAlignment(HSSFCellStyle.ALIGN_CENTER);
/*
Statement stmt=  null; 
ResultSet rs = null;

stmt = obBean.createStatement();
rs = stmt.executeQuery(queryStr);         // 쿼리를 실행합니다.
*/

//컬럼명 찍는 부분  
// ResultSetMetaData rsmd = rs.getMetaData();     //resultset의 메타데이타를 생성합니다.(컬럼명이나,필드속성등의 정보를 받아올수 있습니다.)
//int ColumnsName1 = rsmd.getColumnCount();  //컬럼수를 카운드
 int numberOfColumns= 3;  //컬럼수를 카운드
  int numberOfColumns1 = 3;  //컬럼수를 카운드
//String[] ColumnsName1=new String[numberOfColumns];  //컬럼이름을 담을 변수를 배열로 지정합니다.
String[] ColumnsName={"위협유형", "위협명", "상세위협"};  //컬럼이름을 담을 변수를 배열로 지정합니다.
String[] ColumnsName1={"D", "A", "E"};  //컬럼이름을 담을 변수를 배열로 지정합니다.
// int[] ColumnsType = new int[numberOfColumns];     //컬럼의 타잎정보(즉,String , Integer, Decimal등 자료형을 가져옵니다.
		 
		 
		 
		   row = sheet1.createRow((short)0);	 

for(int ii=0;ii<numberOfColumns;ii++){  
	//길이 조절
		 sheet1.setColumnWidth((short) ii, (short)(300*15));
	  //  ColumnsName[ii]=rsmd.getColumnName(ii+1);  
	  //  ColumnsType[ii]=rsmd.getColumnType(ii+1);
	    cell = row.createCell((short) ii);
	   // cell.setEncoding(HSSFCell.ENCODING_UTF_16);   // 한글 출력시에는 UTF_16으로 해야함. 한글이 2byte이기때문에..(이제 필요없음)
	    cell.setCellValue(ColumnsName[ii]);  
	  //  cell.setCellValue(ColumnsName[ii]);      // xls화일의  첫줄에 db의 컬럼명을 출력한다.
	    cell.setCellStyle(style);                     //스타일적용(글씨 색,배경색, 정렬, 크기등을 넣을수 있다.)
	    sheet1.addMergedRegion(new Region(0,(short) ii,1,(short) ii));   
	   }  

//sheet1.addMergedRegion(new CellRangeAddress(0,1,(short)0,(short)0));
cell = row.createCell((short)3);
cell.setCellValue("위협원천");
cell.setCellStyle(style);             
cell = row.createCell((short)4);
cell.setCellStyle(styleMid);             
cell = row.createCell((short)5);
cell.setCellStyle(styleMid);             
sheet1.addMergedRegion(new Region(0,(short)3,0,(short)5));
//sheet1.addMergedRegion(new CellRangeAddress(0,0,(short)1,(short)3));





row = sheet1.createRow((short)1);
for(int j=0;j<numberOfColumns;j++){  
	  cell = row.createCell((short) j);
	  cell.setCellStyle(style);
}

for(int ii=0;ii<numberOfColumns1;ii++){  
//  ColumnsName[ii]=rsmd.getColumnName(ii+1);  
//  ColumnsType[ii]=rsmd.getColumnType(ii+1);
 cell = row.createCell((short)(ii+numberOfColumns));
// cell.setEncoding(HSSFCell.ENCODING_UTF_16);   // 한글 출력시에는 UTF_16으로 해야함. 한글이 2byte이기때문에..(이제 필요없음)
 cell.setCellValue(ColumnsName1[ii]);  
//  cell.setCellValue(ColumnsName[ii]);      // xls화일의  첫줄에 db의 컬럼명을 출력한다.
 cell.setCellStyle(style);                     //스타일적용(글씨 색,배경색, 정렬, 크기등을 넣을수 있다.)
}  




List<MtkindVO> list=(List<MtkindVO>)request.getAttribute("list");
if(list.size()!=0){//0이 아닐때
for(int iii=0;iii<list.size();iii++){
	MtkindVO vo=(MtkindVO)list.get(iii);
	  
	  
	  row = sheet1.createRow((short)(iii+2));
	  
	    for(int jj=0;jj<numberOfColumns;jj++){  
	    	 cell = row.createCell((short) jj);
	    	//길이 조절
	    	if(jj==0){
				cell.setCellValue(vo.getTk_nm1());
			}else if(jj==1){
				cell.setCellValue(vo.getTk_nm2());
			}else if(jj==2){
				cell.setCellValue(vo.getTk_nm3());
			}
			if(iii%2==0){
				if(jj==2){
					cell.setCellStyle(styleLContentDate1); 
				}else{
					cell.setCellStyle(styleLContent1); 
				}
				
		 	 }else if(iii%2!=0){
		 		if(jj==2){
					cell.setCellStyle(styleLContentDate); 
				}else{
					cell.setCellStyle(styleLContent); 
				}
			 }
	    }  	    

	    
	for(int iiii=0;iiii<numberOfColumns1;iiii++){
		cell = row.createCell((short) (iiii+numberOfColumns));
		if(iiii==0){
			cell.setCellValue(vo.getTk_d());
		}else if(iiii==1){
			cell.setCellValue(vo.getTk_a());
		}else if(iiii==2){
			cell.setCellValue(vo.getTk_e());
		}
		if(iii%2==0){
			cell.setCellStyle(styleLContent1); 
	 	 }else if(iii%2!=0){
			  cell.setCellStyle(styleLContent); 
		 }
	}
		    
	  
	  
	  
	  
	
	
	}

	  
	  
	  
}else{//0일때는 데이터 없다는 글을 찍어줌
	  row = sheet1.createRow((short)2);
	  cell = row.createCell((short)0);
	  cell.setCellValue("-데이터가 없습니다-");
	  cell.setCellStyle(styleLContentNoData);       
	  for(int iiiii=1;iiiii<(numberOfColumns+numberOfColumns1);iiiii++){  
		    cell = row.createCell((short)(iiiii));
		    cell.setCellStyle(styleLContentNoData);                     //스타일적용(글씨 색,배경색, 정렬, 크기등을 넣을수 있다.)
		   }  
	 sheet1.addMergedRegion(new Region(2,(short)0,2,(short) (numberOfColumns+numberOfColumns1-1)));
	  //sheet1.addMergedRegion(new CellRangeAddress(2,2,(short)0,(short)10));
}

/*
  while(rs.next()){      //DB의 내용출력부분
   row = sheet1.createRow((short)rsCnt);
   for(int i=1;i<=numberOfColumns;i++){
    cell = row.createCell((short) i);
    cell.setEncoding( HSSFCell.ENCODING_UTF_16 );

  switch(ColumnsType[i-1]){
    case 93:
     cell.setCellValue(rs.getString(i));
     break;
    case 4:
     cell.setCellValue(rs.getInt(i));
     break;
    case 3:
     cell.setCellValue(rs.getFloat(i));
     break;

    default:
     cell.setCellValue(rs.getString(i));
     break;
  }

//case 93 , case 4... 등은 API의 java.sql.TYPE를 찾아보시면 나와있습니다.
}
 
 rsCnt++;
}
*/

//파일저장("_temp/"에 임시 저장을 합니다. 그리고 아래부분에서 다운받는 즉시 삭제합니다. 중복은 거의 없을 겁니다. 이부분에서 고생을 많이 했는데 더 좋은 방법있는분은 알려주세요.)
FileOutputStream fileOut = null;
String context=getServletContext().getRealPath("/");
try{
 fileOut = new FileOutputStream(context+filename);
}catch(FileNotFoundException e){
 System.out.println(e);
}
try{
 wb.write(fileOut);
 fileOut.close();
}catch(IOException e){
 System.out.println(e);
}



%>


<% 
//여기부터 화일 다운로드 창이 자동으로 뜨게 하기 위한 코딩(임시화일을 스트림으로 저장)
File file = new File (context+filename);  //해당 경로의 파일 객체를 만든다. 
byte[] bytestream = new byte[(int)file.length()];  //파일 스트림을 저장하기 위한 바이트 배열 생성. 
FileInputStream filestream = new FileInputStream(file);   //파일 객체를 스트림으로 불러온다. 
int i = 0, j = 0;   //파일 스트림을 바이트 배열에 넣는다. 
while((i = filestream.read()) != -1) { 
bytestream[j] = (byte)i; 
j++; 
}
filestream.close();   //FileInputStream을 닫아줘야 file이 삭제된다.

try{
boolean  success = file.delete(); //화일을 생성과 동시에 byte[]배열에 입력후 화일은 삭제
if(!success) System.out.println("<script>alert('not success')</script>"); 
} catch(IllegalArgumentException e){ 
System.err.println(e.getMessage()); 
} 
	response.setContentType("application/vnd.ms-excel;charset=utf-8");
//response.setContentType("application/x-msdownload;charset=EUC-KR");  //응답 헤더의 Content-Type을 세팅한다.  
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\";"); 
response.setHeader("Content-Transfer-Encoding", "binary"); 

out.clear();
out = pageContext.pushBody();

OutputStream outStream = response.getOutputStream();  // 응답 스트림 객체를 생성한다. 
outStream.write(bytestream);  // 응답 스트림에 파일 바이트 배열을 쓴다. 
outStream.close();

%>